package com.ksd.pug.service.permission;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ksd.orm.pug.mapper.PermissionMapper;
import com.ksd.pug.commons.enums.ResultStatusEnumA;
import com.ksd.pug.commons.ex.PugValidationException;
import com.ksd.pug.commons.utils.collection.CollectionUtils;
import com.ksd.pug.commons.utils.fn.asserts.Vsserts;
import com.ksd.pug.pojo.Permission;
import com.ksd.pug.pojo.RolePermission;
import com.ksd.pug.service.rolepermission.IRolePermissionService;
import com.ksd.pug.vo.RolePermissionVo;
import com.ksd.pug.vo.user.PermissionVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;


/**
 * PermissionServiceImpl实现类
 * 创建人:hcl<br/>
 * 时间：2022-02-21 15:16:27 <br/>
 * @version 1.0.0<br/>
 *
*/
@Service
@Slf4j
public class PermissionServiceImpl extends ServiceImpl<PermissionMapper,Permission> implements IPermissionService  {

    @Autowired
    private IRolePermissionService rolePermissionService;

    /**
     * 查询分页&搜索权限管理
     * 创建人:hcl
     * 创建时间：2022-02-21 15:16:27
     * @version 1.0.0
     */
    @Override
	public IPage<Permission> findPermissionPage(PermissionVo permissionVo){
	    // 设置分页信息
		Page<Permission> page = new Page<>(permissionVo.getPageNo(),permissionVo.getPageSize());
		// 设置查询条件
        LambdaQueryWrapper<Permission> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        // lambdaQueryWrapper.select(Permission.class, column -> !column.getColumn().equals("description"));
        // 根据关键词搜索信息
        //lambdaQueryWrapper.like(Vsserts.isNotEmpty(permissionVo.getKeyword()), Permission::getName,permissionVo.getKeyword());
         //查询发布的 0 未发布  1 发布
        lambdaQueryWrapper.eq(permissionVo.getStatus() != null ,Permission::getStatus,permissionVo.getStatus());
        //查询未删除的 0 未删除  1 删除
        lambdaQueryWrapper.eq(permissionVo.getIsDelete() != null ,Permission::getIsdelete,permissionVo.getIsDelete());
        // 多列搜索
         lambdaQueryWrapper.and(Vsserts.isNotEmpty(permissionVo.getKeyword()),wrapper -> wrapper
                 .like(Permission::getName, permissionVo.getKeyword())
                 .or()
                 .like(Permission::getTitle, permissionVo.getKeyword())
         );
        // 根据时间排降序
        lambdaQueryWrapper.orderByAsc(Permission::getSorted);
        lambdaQueryWrapper.orderByAsc(Permission::getIndexon);
        // 查询分页返回
		IPage<Permission> results = this.page(page,lambdaQueryWrapper);
		return results;
	}

    /**
     * 查询权限管理列表信息
     * 创建人:hcl
     * 创建时间：2022-02-21 15:16:27
    */
    @Override
    public List<Permission> findPermissionList() {
     	// 1：设置查询条件
        LambdaQueryWrapper<Permission> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        // 2：查询发布的 0 未发布  1 发布
        lambdaQueryWrapper.eq(Permission::getStatus,1);
        lambdaQueryWrapper.eq(Permission::getIsdelete,0);
        // 3: 查询返回
        return this.list(lambdaQueryWrapper);
    }

    /**
     * 查询权限管理列表信息 Tree
     */
    @Override
    public List<Permission> findPermissionTree() {
        // 1：设置查询条件
        LambdaQueryWrapper<Permission> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        // 2：查询发布的 0 未发布  1 发布
        lambdaQueryWrapper.eq(Permission::getStatus,1);
        lambdaQueryWrapper.eq(Permission::getIsdelete,0);
        lambdaQueryWrapper.orderByAsc(Permission::getIndexon);
        // 3: 查询返回
        List<Permission> list = this.list(lambdaQueryWrapper);

        //查询所有父
        List<Permission> permission = list.stream()
                .filter(c -> c.getPid().equals(0L)).collect(Collectors.toList());
        //根据当前的id去找对应的子集
        permission.forEach(item -> {
            // 找到每个父元素的子集
            List<Permission> childrenList = list.stream()
                    .filter(c -> item.getId().equals(c.getPid())).collect(Collectors.toList());
            // 如果为空，代表没有匹配带子元素，就放一个空集合进去，目的：保证数据解构的完整性，已经方便后续前台的判断
            if (CollectionUtils.isEmpty(childrenList)) {
                childrenList = new ArrayList<>();
            }
            item.setChildrens(childrenList);
        });
        return permission;
    }

	/**
     * 根据id查询权限管理明细信息
     * 创建人:hcl
     * 创建时间：2022-02-21 15:16:27
     * @version 1.0.0
     */
    @Override
    public Permission getPermissionById(Long id) {
        return this.getById(id);
    }


    /**
     * 保存&修改权限管理
     * 创建人:hcl
     * 创建时间：2022-02-21 15:16:27
     * @version 1.0.0
     */
    @Override
	public Permission saveupdatePermission(Permission permission){
		boolean flag = this.saveOrUpdate(permission);
		return flag ? permission : null;
	}


    /**
     * 根据id删除权限管理
     * 创建人:hcl
     * 创建时间：2022-02-21 15:16:27
     * @version 1.0.0
     */
    @Override
    public int deletePermissionById(Long id) {
        boolean b = this.removeById(id);
        return b ? 1 : 0;
    }

    /**
     * 根据id删除
     * 创建人:hcl
     * 创建时间：2022-02-21 15:16:27
     */
    @Override
    public boolean delBatchPermission(String ids) {
        try {
            // 1 : 把数据分割
            String[] strings = ids.split(",");
            // 2: 组装成一个List<Permission>
            List<Permission> permissionList = Arrays.stream(strings).map(idstr -> {
                Permission permission = new Permission();
                permission.setId(new Long(idstr));
                permission.setIsdelete(1);
                return permission;
            }).collect(Collectors.toList());
            // 3: 批量删除
            return this.updateBatchById(permissionList);
        } catch (Exception ex) {
            throw new PugValidationException(ResultStatusEnumA.SERVER_DB_ERROR);
        }
    }

    //根据ids保存角色对应的权限
    @Override
    @Transactional
    public boolean savePermissionRole(RolePermissionVo rolePermissionVo) {
        List<Long> listIds = Arrays.asList(rolePermissionVo.getIds().split(",")).stream().map(s -> Long.parseLong(s.trim())).collect(Collectors.toList());
        //根据角色id删除
        rolePermissionService.remove(new LambdaQueryWrapper<RolePermission>()
                .eq(RolePermission::getRoleId,rolePermissionVo.getRoleId()));
        //批量添加
        List<RolePermission> collect = listIds.stream().map(type -> {
            RolePermission rolePermission = new RolePermission();
            rolePermission.setPermissionId(type);
            rolePermission.setRoleId(rolePermissionVo.getRoleId());
            return rolePermission;
        }).collect(Collectors.toList());
        rolePermissionService.saveBatch(collect);
        return true;
    }

//    public static void main(String[] args) {
//        String ids= "1,2,3,4,5,6";
//        List<Long> listIds = Arrays.asList(ids.split(",")).stream().map(s -> Long.parseLong(s.trim())).collect(Collectors.toList());
//        System.out.println(listIds);//[1,2,3,3,4,5,6]
//    }

}